package com.itheima.controller;

import com.itheima.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.UUID;

/**
 * 通用控制器
 *2)在controller包创建CommonController
 * @author hua
 * @since 2022/11/4 11:28
 */
@Slf4j
@RestController
@RequestMapping("/common")
public class CommonController {
    //根据注解,拿到我们配置文件中的内容
    /**
     * 文件上传后的保存路径
     * 1).Yml文件配置上传路径
     */
    @Value("${reggie.path}")
    private String basePath;
    //前后端连通
    //1. 请求路径
    //2. 请求方式
    //3. 请求参数
    //4. 返回值
    /**
     * 文件上传
     */
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file){
   //在文件上传的时候,是会先把文件保存到一个临时目录中
        log.info("前后端连通");
        // 3).获取文件名和后缀名
        //文件名
        String oldFilename = file.getOriginalFilename();
        //后缀名
        //abd.txt
        // 拿到的是"." 最后一次出现的文件
        int index = oldFilename.lastIndexOf(".");
        //文件后缀 .txt
        String suffix = oldFilename.substring(index);
        //4.使用UUID重新生成新图片文件名
        String uuid = UUID.randomUUID().toString();
        //拼接一个新的文件名
        String newFileName=uuid + suffix;
        //5.创建图片保存目录
        //new File的时候是不会在硬盘中真正的创建路径的
        //这里只是在内存中创建了File对象
        //如果在new file的时候就创建了我们制定的路径或者是文件
        File dir = new File(basePath);
        //路径是否不存在
        //如果已经创建了,那么就不需要在判断
        if (!dir.exists()){
            //如果文件夹不存在,就创建这个文件夹
            dir.mkdirs();
        }
        //6.保存临时文件到图片目录下
        //文件转移
        try {
            //文件转移
            //file ===> basePath路径下,并且文件名是newFileName
            file.transferTo(new File(basePath,newFileName));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        //7.返回新图片文件名
        return R.success(newFileName);
    }
/**
 * 文件下载
 * 下载到你的浏览器中
 */
@GetMapping("/download")
public void download(String name, HttpServletResponse response){
    log.info("name ===> {}",name);
    //1.定义输入流,通过输入流读取文件内容
    //根据输入读取文件
    File file = new File(basePath, name);
    //拿到了我们要用的文件
    try {
        FileInputStream fileInputStream = new FileInputStream(file);
        //2.通过response对象设置响应数据格式(imag/jpeg)
        //response.setContentType(MediaType.IMAGE_JPEG_VALUE);
        response.setContentType("imag/jpeg");
        //3.通过response对象,获取到输出流
        ServletOutputStream outputStream = response.getOutputStream();
        //4.通过输入流读取文件数据,然后通过输出流写回浏览器
        //每次读取数据的长度
        int length=0;
        //通常都会通过每次往浏览器发送1KB的方式写回到浏览器中
        //这样可以避免如果返回大数据量的话,浏览器出问题
        byte[] bytes = new byte[1024];
       //fileInputStream.read()读取文件时,如果返回的是-1,就代表文件读完了
       //读完之后跳出循环体即可
        while ((length=fileInputStream.read(bytes)) !=-1){
            //写文件到浏览器中
            outputStream.write(bytes,0,length);
            outputStream.flush();
        }
        //5.关闭资源(仅关闭本地文件流即可)
        fileInputStream.close();
    } catch (Exception e) {

        throw new RuntimeException(e);
    }

}
}
